<?php
/**
 * Created by lni_wang.
 * Product: PhpStorm
 * Date: 2017/4/17 13:39
 * File: MY_Model.php
 * 错误处理
 * 数据库连接
 */

class MY_Model extends CI_Model
{
    private $db_table;
    private $db_map;
    function __construct(){
        parent::__construct();
        $config = $this->config->item('mysql');
        $this->load->library('Redis_hash', null, 'cache');
        $this->db_table     = $config['tables'];
        $this->db_map       = $config['db_maps'];
    }

    private function __table_config($table)
    {
        if(!isset($this->db_table[$table])){
            throw new SysException(30002);
        }

        $table      = $this->db_table[$table];
        if(!isset($this->db_map[$table['map']])){
            throw new SysException(30002);
        }

        return $this->db_map[$table['map']];
    }

    /**
     * 获得数据库连接
     * @param $table
     *
     * @return mixed
     * @throws SysException
     */
    protected function db($table)
    {
        static $_list = [];
        if(isset($_list[$table])){
            $db = $_list[$table];
        }else{
            $config = $this->__table_config($table);
            $db = connect_db($config);
        }
        return $db;
    }


    /**
     * 获得缓存连接
     * @param $table
     *
     * @return mixed
     */
    protected function cache($key=null)
    {
        $cache = $this->cache->redis($key);
        return $cache;
    }


    /**
     * 数据库获得单行函数
     * @param        $table
     * @param string $fields
     * @param array  $where
     *
     * @return mixed
     */
    protected function get_row($table,  array $where=[], $fields='*', array $order_by=[])
    {
        $query = $this->db($table);
        $query->select($fields)->from($table);
        $where      && $query->where($where);
        $order_by   && $query->order_by(implode(', ', $order_by));
        $result = $query->get();
        $list = $result->row_array();
        $result->free_result();

        return $list;
    }

    /**
     * 数据库获得多行数据
     * @param        $table
     * @param string $fields
     * @param array  $where
     *
     * @return mixed
     */
    protected function get_list($table, array $where=[], $fields='*',  array $order_by=[])
    {
        $query = $this->db($table);
        $query->select($fields)->from($table);


        $where      && $query->where($where);
        $order_by   && $query->order_by(implode(', ', $order_by));

        $result = $query->get();
        $list = $result->result_array();
        $result->free_result();
        return $list;
    }

    /**
     * 获得条数
     * @param       $table
     * @param array $where
     */
    protected function get_total($table, array $where=[])
    {
        $query = $this->db($table);
        $query->from($table);
        $where && $query->where($where);
        $result = $query->get();

        $count = $result->num_rows();
        $result->free_result();
        return $count;
    }

    /**
     * 数据库获得多行数据, 基于分页
     * @param        $table
     * @param string $fields
     * @param array  $page
     *          type 分页类型(1 页面模式, 2 数值偏移量模式. 3 id 偏移模式)
     *              1 页面模式
     *                  page_no/page_size
     *              2 数值偏移量模式
     *                  start/count
     *              3 id 偏移模式
     *                  start_id/count/status['next','prev']
     * @param array  $where
     */
    protected function page_list($table, $fields='*', array $page=[], array $where=[], array $order_by=[])
    {

    }

    /**
     * 循环取出列表数据
     * @param        $table
     * @param string $fields
     * @param        $function
     * @param array  $where
     */
    protected function each_list($table, $fields='*', $function, $size=20, array $where=[], array $order_by=[])
    {

    }

    /**
     * 修改数据
     * @param       $table
     * @param array $data
     * @param array $where
     */
    protected function update($table, array $data, array $where)
    {
        return $this->db($table)
            ->set($data)
            ->where($where)
            ->update($table);
    }

    /**
     * 插入数据单行
     * @param       $table
     * @param array $data
     */
    protected function insert($table, array $data)
    {
        return $this->db($table)->insert($table, $data);
    }

    /**
     * 获得最后插入的ID
     * @param $table
     *
     * @return mixed
     */
    protected function insert_id($table)
    {
        return $this->db($table)->insert_id();
    }

    /**
     * 插入多行数据
     * @param       $table
     * @param array $data
     */
    protected function insert_batch($table, array $data)
    {

    }

    /**
     * 虚拟删除
     * @param       $table
     * @param array $where
     */
    protected function virtual_delete($table, array $where)
    {

    }

    /**
     * 数据库删除
     * @param       $table
     * @param array $where
     */
    protected function db_delete($table, array $where)
    {
        return $this->db($table)->delete($table, $where);
    }

    /**
     * 基于2维数组, 取出关联的行数据
     * @param        $list
     * @param        $table
     * @param        $key
     * @param string $fields
     * @param array  $where
     */
    protected function list_2d_by_row(array $list, $table, $key, $fields='*', array $where=[], array $list_where=[])
    {

    }

    /**
     * 基于1维数组, 取出关联的行数据
     * @param array  $list
     * @param        $table
     * @param        $key
     * @param string $fields
     * @param array  $where
     */
    protected function list_1d_by_row(array $list, $table,$fields='*', array $where=[])
    {

    }

    /**
     * 基于2维数组取出子数据列表
     * @param array  $list
     * @param        $table
     * @param        $key
     * @param string $row_name
     * @param string $fields
     * @param array  $where
     */
    protected function list_2d_by_sub_row(array $list, $table, $key, $row_name='sub_list',$fields='*', array $where=[], array $list_where=[])
    {


    }

    /**
     * 基于1维数组取出子数据列表
     * @param array  $list
     * @param        $table
     * @param string $row_name
     * @param string $fields
     * @param array  $where
     */
    protected function list_1d_by_sub_row(array $list, $table, $row_name='sub_list',$fields='*', array $where=[])
    {

    }

    /**
     * 从缓存获得数据列表
     * @param       $table
     * @param array $where
     */
    protected function get_list_by_cache($table, array $where=[])
    {

    }

    /**
     *从缓存获得单行数据
     * @param $table
     * @param $key
     */
    protected function get_row_by_cache($table, $key)
    {

    }
    /**
     * 刷新缓存数据
     * @param $table
     * @param $key
     */
    protected function refurbish_cache($table, $key=null)
    {

    }

    /**
     * 删除缓存数据
     * @param $table
     * @param $key
     */
    protected function clear_cache($table, $key)
    {
        $cache_key = $table.':'.$key;
        $this->cache($table)->delete($cache_key);
    }

    /**
     * 获得缓存数据
     * @param $table
     * @param $key
     */
    protected function get_cache($table, $key)
    {
        $cache_key = $table.':'.$key;
        $this->cache($table)->get($cache_key);
    }

    /**
     * 添加缓存数据
     * @param $table
     * @param $data
     */
    protected function insert_cache($table, $key, array $data)
    {
        $cache_key = $table.':'.$key;
        $this->cache($table)->set($cache_key, json_encode($data));
    }

    /**
     * 添加多行数据到缓存
     * @param $table
     * @param $data
     */
    protected function insert_batch_cache($table, $data)
    {

    }

    /**
     * 对数组进行调节过滤
     * @param array $list
     * @param array $where
     */
    private function _check_array(array $list, array $where=[])
    {

    }
}